﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <Windows.h>


//int main()
//{
//	int a = 10000;
//	FILE* pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中
//	fclose(pf);
//	pf = NULL;
//	//不用的指针置空
//	return 0;
//}


int main()
{
	FILE* pFile;
	//打开⽂件
	pFile = fopen("myfile.txt", "w");

	//⽂件操作
	if (pFile != NULL)
	{
		printf("ftell(pFile)=%d\n", ftell(pFile));//返回⽂件指针相对于起始位置的偏移量
		
		fputs("123456789", pFile);
		printf("sleep\n");
		Sleep(10000);
		fclose(pFile);//关闭文件可以刷新缓冲区
		printf("fclose\n");
		Sleep(10000);
		pFile = fopen("myfile.txt", "w");
		printf("ftell(pFile)=%d\n", ftell(pFile));
		fseek(pFile, 9, SEEK_SET);//将文件指针向后偏移9
		printf("fseek 9\n");
		printf("ftell(pFile)=%d\n", ftell(pFile));
		rewind(pFile);//让⽂件指针的位置回到⽂件的起始位置
		printf("rewind\n");
		printf("ftell(pFile)=%d\n", ftell(pFile));
		fputs("qwertyuui", pFile);


		//feof//检查是否已抵达给定文件流的结尾。//注意不是文件
		// 此函数仅报告最近一次 I/O 操作所报告的流状态，而不检验关联的数据源。例如，若最近一次 I/O 是抵达文件最后字节的 fgetc ，则 feof 返回零。下个 fgetc 失败并更改流状态为文件尾。然后 feof 才返回非零。
       //典型用法中，输入流处理在任何错误时停止；而 feof 和 ferror 用于区别不同错误条件。
		//关闭⽂件
		fclose(pFile);
		int c; // 注意：int，⾮char，要求处理EOF
		FILE* fp = fopen("myfile.txt", "r");
		if (!fp) {
			perror("File opening failed");
			return EXIT_FAILURE;
		}
		//fgetc 当读取失败的时候或者遇到⽂件结束的时候，都会返回EOF
		while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
		{
			putchar(c);
		}
		putchar('\n');
		//判断是什么原因结束的
		if (ferror(fp))
			puts("I/O error when reading");
		else if (feof(fp))
			puts("End of file reached successfully");
		fclose(fp);


		//关闭之后文件指针也回归开头了
	}
	else
	{
		perror("Error opening file");
	}
	return 0;
}